#include <stdio.h>
#include <stdint.h>

#include "iot_adc.h"             // OpenHarmony ADC操作接口
#include "iot_errno.h"           // OpenHarmony错误码定义
#include "moisture_sensor.h"

#define MOISTURE_ADC_CHANNEL 0   // ADC
#define ADC_MAX_VALUE 1023.0f    // 10位 ADC 最大值
#define VREF 3.3f                // 参考电压

// ***************************************************************
// * 函数名称: moisture_sensor_init
// * 说    明: 初始化土壤湿度传感器 ADC 通道
// * 参    数: 无
// * 返 回 值: 无
// ***************************************************************
void moisture_sensor_init(void)
{
    int ret = IoTAdcInit(MOISTURE_ADC_CHANNEL);//初始化指定ADC通道
    if (ret == IOT_SUCCESS) {
        printf("[Moisture] ADC 初始化成功 (通道: %d)\n", MOISTURE_ADC_CHANNEL);
    } else {
        printf("[Moisture] ADC 初始化失败\n");
    }
}

// ***************************************************************
// * 函数名称: moisture_sensor_read_data
// * 说    明: 读取 ADC 并计算土壤湿度百分比
// * 参    数: moisture_percent：返回湿度值（0~100）
// * 返 回 值: 无
// ***************************************************************
void moisture_sensor_read_data(double *moisture_percent)
{
    unsigned int adc_val = 0;
    int ret = IoTAdcGetVal(MOISTURE_ADC_CHANNEL, &adc_val);//读取ADC原始值（0~1023）
    if (ret != IOT_SUCCESS) {
        printf("[Moisture] ADC 获取失败\n");
        *moisture_percent = -1.0;
        return;
    }
    int retry = 0;

    for (retry = 0; retry < 5; retry++) {
        ret = IoTAdcGetVal(MOISTURE_ADC_CHANNEL, &adc_val);
        if(ret == IOT_SUCCESS) break;
        printf("[Moisture] ADC 获取失败，重试第%d次\n", retry + 1);
        LOS_Msleep(20);
    }

    if(retry >= 3){
        //重试超过三次，给出异常值退出
        printf("[Moisture] ADC 获取失败，重试次数达到上限，退出\n");
        *moisture_percent = -100.0;
        return;
    }

    printf("[Moisture] ADC原始值: %u\n", adc_val);

    // 模拟值越高 -> 土壤越干燥，因此需要反转
    // 湿土：ADC值低；干土：ADC值高
    float percentage = 100.0f * (1.0f - (float)adc_val / ADC_MAX_VALUE);

    if (percentage < 0.0f) percentage = 0.0f;
    if (percentage > 100.0f) percentage = 100.0f;

    *moisture_percent = percentage;

    printf("[Moisture] 土壤湿度: %.2f%%\n", *moisture_percent);
}
